﻿package scrn;


import java.awt.*;
import java.awt.event.MouseEvent;

import javax.swing.*;

import core.*;
import cont.*;
import media.*;


// ============================================ Отображает список всех контактов
public class ContList extends JList {

// =================================================================== Константы
private static final long serialVersionUID = 1L;
private static final int ITEM_UNK = 0;
private static final int ITEM_ROOM_HEAD = 1;
private static final int ITEM_ONE_HEAD = 2;
private static final int ITEM_ROOM = 11;
private static final int ITEM_ONE = 12;
private static final int ITEM_ADD_ROOM = 21;
private static final int ITEM_ADD_ONE = 22;

// ================================================================== Переменные

private DefaultListModel listModel; // Содержимое списка

private int roomHead; // Заголовок комнат
private int roomAdd; // Добавление комнаты

private int oneHead; // Заголовок комнат
private int oneAdd; // Добавление комнаты

private String imOne = "one_bl.png"; // Картинка приватов
private String imPlus = "plus.png"; // Картинка с плюсиком
private String imRoom = "room.png"; // Картинка комнат
private String imD = "down.png"; // Картинка стрелки вниз
private String imR = "right.png"; // Картинка стрелки вправо

private String ht1 = "<html><img src='";
private String ht2 = "' align='middle' />";
private String ht3 = "</html>";


// =============================================================== Инициализация

public ContList() {

	Mess.m("ContList.init", "init");
}


// ================================================================ Щелчок мышью
public void mousePressed(MouseEvent evt, JPopupMenu popContList) {

	//	Mess.m("ContList.mousePressed", "but=" + evt.getButton());

	if (evt.getButton() != MouseEvent.BUTTON3) { // Щелчок колесом или левой кнопкой
		selCont();
	} else { // Правый щелчок
		for (int i = 0; i < listModel.getSize(); i++) {
			Rectangle r = getCellBounds(i, i);
			if (r.contains(evt.getPoint())) {
				this.setSelectedIndex(i);
				break;
			}
		}
		int itemType = selCont();

		switch (itemType) {
			case ITEM_ONE:
			case ITEM_ROOM:
				popContList.show(evt.getComponent(), evt.getX(), evt.getY());
				break;
			default:
				this.requestFocusInWindow();
		}

	}

}


// =============================================================== Задать модель
public void setMyModel() {

	listModel = (DefaultListModel) this.getModel();
	listModel.removeAllElements();

}


// ============================================================ Добавить элемент
private void addEl(String imageName, String text) {

	listModel.addElement(ht1 + Pic.getURL(imageName) + ht2 + text + ht3);
}


// ============================================================ Добавить элемент
private void addEl(String imageName, String text, int index) {

	listModel.add(index, ht1 + Pic.getURL(imageName) + ht2 + text + ht3);
}


// ============================================================ Изменить элемент
private void setEl(String imageName, String text, int index) {

	listModel.set(index, ht1 + Pic.getURL(imageName) + ht2 + text + ht3);
}


// ============================================================ Добавить комнаты
private int addOnes(boolean fInsert) {

	int contTot = Man.contMan.getTot(Cont.ONE);

	for (int q = 0; q < contTot; ++q) {
		if (fInsert) {
			addEl(imOne, Man.contMan.getContName(Cont.ONE, q), oneHead + q + 1);
		} else {
			addEl(imOne, Man.contMan.getContName(Cont.ONE, q));
		}
	}

	oneAdd = oneHead + ++contTot;

	if (fInsert) {
		addEl(imPlus, "добавить контакт", oneAdd);
	} else {
		addEl(imPlus, "добавить контакт");
	}

	return contTot;

}


// ============================================================ Добавить комнаты
private int addRooms(boolean fInsert) {

	int contTot = Man.contMan.getTot(Cont.ROOM);

	for (int q = 0; q < contTot; ++q) {
		if (fInsert) {
			addEl(imRoom, Man.contMan.getContName(Cont.ROOM, q), roomHead + q + 1);
		} else {
			addEl(imRoom, Man.contMan.getContName(Cont.ROOM, q));
		}
	}

	roomAdd = roomHead + ++contTot;

	if (fInsert) {
		addEl(imPlus, "добавить комнату", roomAdd);
	} else {
		addEl(imPlus, "добавить комнату");
	}

	return contTot;

}


//============================================================= Изменился статус
public boolean chStat(String statText) {

	return false;

}


// ============================================================= Удалить контакт
public void delCont() {

	int contType = Cont.UNK; // Тип контакта
	int contNum = -1; // Номер контакта


	int ind = this.getSelectedIndex();

	if (ind > roomHead && ind < roomAdd) { // Выбрана комната
		contType = Cont.ROOM;
		contNum = ind - roomHead - 1;
		roomAdd--;
		oneHead--;
		oneAdd--;
	} else if (ind > oneHead && ind < oneAdd) { // Выбран контакт
		contType = Cont.ONE;
		contNum = ind - oneHead - 1;
		oneAdd--;
	}


	if (contType != Cont.UNK) {
		try {

			listModel.remove(ind);

			Man.ioMan.outDelCont(contType, contNum);
			synchronized (Man.main) {
				Man.contMan.delCont(contType, contNum);
			}

		} catch (Exception e) {
			Mess.err("ContList.delCont", e);
			Man.scrMan.showAlert("Ошибка удаления контакта",
					"Не удалось отправить запрос на сервер. Проверьте наличие связи!", 5,
					true);
		}

		this.selUpdate();
	}

}


// ======================================== Обновить индекс выделенного элемента
public void selUpdate() {


	if (Man.contMan.fContCh) { // Список контактов изменился
		Man.contMan.fContCh = false;
		// Собираем список контактов:
		listModel.removeAllElements();

		roomHead = 0;
		if (roomAdd >= 0) {
			addEl(imD, "<strong>КОМНАТЫ:</strong>");
			addRooms(false);
		} else {
			addEl(imR, "<strong>КОМНАТЫ</strong>");
		}

		oneHead = roomAdd + 1;
		if (oneAdd >= 0) {
			addEl(imD, "<strong>ПРИВАТ:</strong>");
			addOnes(false);
		} else {
			addEl(imR, "<strong>ПРИВАТ</strong>");
		}
	}

	Man.contMan.getSelType();
	int contNum = Man.contMan.getSelNum();
	int selInd = 0;

	switch (Man.contMan.getSelType()) {
		case Cont.ROOM:
			if (roomAdd > 0) { // Комнаты развернуты
				selInd = contNum + roomHead + 1;
			} else { // Комнаты свернуты
				selInd = roomHead;
			}
			break;
		case Cont.ONE:
			if (oneAdd > 0) { // Приваты развернуты
				selInd = contNum + oneHead + 1;
			} else { // Приваты свернуты
				selInd = oneHead;
			}
			break;
	}

	this.setSelectedIndex(selInd);
	ensureIndexIsVisible(selInd);

}


// =========================================================== Отобразить список
public void paint(Graphics g) {

	super.paint(g);
}


// ================================================================= Нажат пункт
public int selCont() {

	int itemType = ITEM_UNK;
	int ind = this.getSelectedIndex();

	if (ind == roomHead) { // Развернуть/свернуть комнаты
		itemType = ITEM_ROOM_HEAD;
		if (roomAdd > roomHead) { // Свернуть
			for (int q = roomAdd - roomHead - 1; q >= 0; --q) {
				listModel.remove(roomHead + 1);
			}
			oneHead -= roomAdd - roomHead;
			oneAdd -= roomAdd - roomHead;
			roomAdd = -1;

			setEl(imR, "<strong>КОМНАТЫ</strong>", roomHead);

		} else { // Развернуть
			addRooms(true);
			oneHead += roomAdd - roomHead;
			oneAdd += roomAdd - roomHead;

			setEl(imD, "<strong>КОМНАТЫ:</strong>", roomHead);
		}
	} else if (ind > roomHead && ind < roomAdd) { // Выбрана комната
		itemType = ITEM_ROOM;
		Man.scrMan.showCont(Cont.ROOM, ind - roomHead - 1);
	} else if (ind == roomAdd) { // Добавить комнату
		itemType = ITEM_ADD_ROOM;
		Man.scrMan.showFindRoom();
	} else if (ind == oneHead) { // Развернуть/свернуть контакты
		itemType = ITEM_ONE_HEAD;
		if (oneAdd > oneHead) { // Свернуть
			for (int q = oneAdd - oneHead - 1; q >= 0; --q) {
				listModel.remove(oneHead + 1);
			}
			oneAdd = -1;

			setEl(imR, "<strong>ПРИВАТ</strong>", oneHead);

		} else { // Развернуть
			addOnes(false);

			setEl(imD, "<strong>ПРИВАТ:</strong>", oneHead);
		}
	} else if (ind > oneHead && ind < oneAdd) { // Выбран контакт
		itemType = ITEM_ONE;
		Man.scrMan.showCont(Cont.ONE, ind - oneHead - 1);
	} else if (ind == oneAdd) { // Добавить контакт
		itemType = ITEM_ADD_ONE;
		Man.scrMan.showFindOne();
	}

	return itemType;
}


}
